# include<stdio.h>
# include<stdlib.h>
# include<string.h>
# include<windows.h>

# define STU_NUM 50
# define COUSE_NUM 10
# define NAME_LEN 10
# define POS_X1 35
# define POS_X2 40
# define POS_X3 50
# define POS_X4 65
# define POS_Y 3

typedef struct Student{
	long num;
	char name[NAME_LEN];
	float score[COUSE_NUM];
	float sum;
	float aver;
}Student;
typedef struct Node{
	Student stu;//学生信息
	struct Node* pNext;	//指向下一个节点
}Node;
//创建头节点
Node *g_pHead = NULL;
//记录最初始的头节点
Node *t_pHead = NULL;
	
//自定义函数声明
int Menu(void);//操作菜单
void SetPosition(int x,int y);//设置输出内容在控制台窗口中的起始位置
void InputRecord(int* n, int* m, Student stu[] );//输入学生信息
void AppendRecord(int *n, int m,Student stu[] );//增加学生信息
void DeleteRecord( int *n, int m,Student stu[]);//删除学生信息（指删除整条记录）
void SearchbyNumber(int n,int m, Student stu[]); //按学号查询学生信息
void SearchbyName(int n, int m,Student stu[]);//按姓名查询学生信息
void ModifyRecord(int n, int m,Student stu[] );//修改学生信息
void CalculateScoreOfStudent( int n, int m,Student stu[]);//计算学生的总分和平均分司热
void CalculateScoreOfCourse( int n, int m,Student stu[]);//计算某门课程总分和平均分
void SortbyNumber(int n, int m,Student stu[]);//按学号排序
void SortbyName( int n, int m,Student stu[]);//按姓名排序
void SortbyScore( int n, int m,Student stu[],int(*compare)(float a, float b));//按每个学生平均分排序
int Ascending(float a, float b);//升序排序
int Descending(float a, float b);//降序
void StatisticAnalysis( int n, int m,Student stu[]);//统计并输出每个分数段学生人数及占比
void PrintRecord( int n, int m,Student stu[]);//打印学生成绩
void WritetoFile( int n, int m,Student record[]);//将学生信息保存到文件
int ReadfromFile( int *n, int *m,Student record[], int *first);//将学生信息从文件中读出，存入内存，方便处理

int main(){
	
	int n=0;
	int m=0;
	int i,j;
	char ch;
	int first=1;
	Student stu[STU_NUM];
	
	system("mode con cols = 130 lines = 60");
	system("color 0E");
	while (1){
		system("cls");
		ch = Menu();
		switch (ch) {
		case 0:
			system("cls");
			printf("退出系统!\n");
			exit(0);
		case 1:
			system("cls");
			InputRecord(&n,&m,stu);
			first = 0;
			break;
		case 2:
			system("cls");
			if (first){
				printf("系统中尚无学习成绩信息，请先输入！\n");
				system("pause");
				break;
			}
			AppendRecord(&n,m,stu);
			system("pause");
			break;
		case 3:
			system("cls");
			if(first){
				printf("系统中尚无学生成绩信息，请先输入！\n");
					system("pause");
					break;
			}
			DeleteRecord(&n,m,stu);
			system("pause");
			break;
		case 4:
			system("cls");
			if (first){
				printf("系统中尚无学生信息，请先输入！\n");
				system("pause");
				break;
			}
			SearchbyNumber(n,m,stu);
			system("pause");
			break;
		case 5:
			system("cls");
			if(first)
			{
				printf("系统中尚无学生成绩信息，请先输入！\n");
					system("pause");
					break;
			}
			SearchbyName(n,m,stu);
			system("pause");
			break;
		case 6:
			system("cls");
			if(first)
			{
				printf("系统中尚无学生成绩信息，请先输入！\n");
				system("pause");
				break;
			}
			ModifyRecord(n,m,stu);
			system("pause");
			break;

		case 7:
			system("cls");
			if(first){
				printf("系统中尚无学生成绩信息，请先输入！\n");
				system("pause");
				break;
			}
			CalculateScoreOfStudent(n,m,stu);
			system("pause");
			break;
		case 8:                                       
			system("cls");
			if(first){
				SetPosition(POS_X3,POS_Y);
				printf("系统中尚无学生成绩信息，请先输入！\n");
				system("pause");
				break;
			}
			CalculateScoreOfCourse( n,  m, stu);
			system("pause");
			break;
    	case 9:
			system("cls");
			if(first){
				SetPosition(POS_X3,POS_Y);
				printf("系统中尚无学生成绩信息，请先输入！\n");
				system("pause");
				break;
			}
			SortbyNumber(n,m,stu);
			system("pause");
			break;
		case 10:
			system("cls");
			if(first){
				SetPosition(POS_X3,POS_Y);
				printf("系统中尚无学生成绩信息，请先输入！\n");
				system("pause");
				break;
			}
			SortbyName(n,m,stu);
			system("pause");
			break;
		case 11:
			system("cls");
			if(first)
			{
				SetPosition(POS_X3,POS_Y);
				printf("系统中尚无学生成绩信息，请先输入！\n");
				system("pause");
				break;
			}
			SortbyScore(n,m,stu,Descending);
			system("pause");
			break;
			
		case 12:
			system("cls");
			if(first){
				SetPosition(POS_X3,POS_Y);
				printf("系统中尚无学生成绩信息，请先输入！\n");
				system("pause");
				break;
			}
			SortbyScore(n,m,stu,Ascending);
			system("pause");
			break;
		case 13:
			system("cls");
			if(first);{
				SetPosition(POS_X3,POS_Y);
				printf("系统中尚无学生成绩信息，请先输入！\n");
				system("pause");
				break;
			}
			StatisticAnalysis(n,m,stu);
			system("pause");
			break;
		case 14:
			system("cls");
			if(first){
				SetPosition(POS_X3,POS_Y);
				printf("系统中尚无学生成绩信息，请先输入!\n");
				system("pause");
				break;
			}
			PrintRecord(n,m,stu);
			system("pause");
			break;
		case 15:
			system("cls");
			if(first){
				SetPosition(POS_X3,POS_Y);
				printf("系统中尚无学生成绩信息，请先输入！\n");
				system("pause");
				break;
			}
			WritetoFile(n,m,stu);
			system("pause");
			break;
		case 16:
			system("cls");
			if(ReadfromFile(&n,&m,stu,&first)||first){
				SetPosition(POS_X1,10);
				printf("尚未输入学生信息或文件打开失败，请先检查！\n");
				system("pause");
				break;
			}
			system("pause");
			first=0;
			break;
		default:
			system("cls");
			printf("输入出错，请重新选择操作!\n");
			system("pause");
		}
	}
	return 0;
	
}

int Menu(){
	int posy = 5;
	int option;
	int i,j;
	SetPosition(POS_X3,posy);
	printf("学生成绩管理系统\n");
	for (int i = 0; i < 2; ++i) {
		SetPosition(POS_X1,++posy);
		for (int j = 0; j < 55; ++j) {
			printf("-");
		}
	}
	SetPosition(POS_X1,++posy);
	printf("1.输入学生信息");
	SetPosition(POS_X4,posy);
	printf("2.增加学生人数");
	SetPosition(POS_X1,posy+=2);
	printf("3.删除学生信息");
	SetPosition(POS_X4,posy);
	printf("4.按学号查找记录");
	SetPosition(POS_X1,posy+=2);
	printf("5.按姓名查找记录");
	SetPosition(POS_X4,posy);
	printf("6.修改学生信息");
	SetPosition(POS_X1,posy+=2);
	printf("7.计算学生成绩");
	SetPosition(POS_X4,posy);
	printf("8.计算课程成绩");
	SetPosition(POS_X1,posy+=2);
	printf("9.按学号排序");
	SetPosition(POS_X4,posy);
	printf("10.按姓名排序");
	SetPosition(POS_X1,posy+=2);
	printf("11.按总成绩降序排序");
	SetPosition(POS_X4,posy);
	printf("12.按总成绩升序排序");
	SetPosition(POS_X1,posy+=2);
	printf("13.学生成绩统计");
	SetPosition(POS_X4,posy);
	printf("14.打印学生记录");
	SetPosition(POS_X1,posy+=2);
	printf("15.学生记录存盘");
	SetPosition(POS_X4,posy);
	printf("16.从磁盘中读取学生记录");
	SetPosition(POS_X1,posy+=4);
	printf("0.退出");
	for (int i = 0; i < 2; ++i) {
		SetPosition(POS_X1,++posy);
		for (int j = 0; j < 55; ++j) {
			printf("-");
		}
	}
	SetPosition(POS_X1,++posy);
	printf("请选择你想要进行的操作[0~16]:[  ]\b\b\b");
	scanf("%d",&option);
	return option;
	
}

void SetPosition(int x, int y){
	HANDLE hOut;
	COORD pos;
	
	hOut = GetStdHandle(STD_OUTPUT_HANDLE);
	pos.X = x;
	pos.Y = y;
	SetConsoleCursorPosition(hOut, pos);
}
//输入学生信息，链表已完成
void InputRecord(int*n, int*m, Student*stu){
	
	int posy=6;
	SetPosition(POS_X2, posy);
	printf("s输入学生人数(n<%d):",STU_NUM);
	scanf("%d",n);
	SetPosition(POS_X2,posy+=2);
	printf("输入课程门数(m<%d):",COUSE_NUM);
	scanf("%d",m);
	for (int i = 0; i < 2; ++i) {
		SetPosition(POS_X1,++posy);
		for (int j = 0; j < 55; ++j) {
			printf("-");
		}
	}
	SetPosition(POS_X2,++posy);
	printf("请输入学生的学号，姓名和各门课程成绩:");
	int bool = 0;//用于第一次循环时记录初始头节点
	for (int i = 0; i < *n; ++i) {
//		SetPosition(POS_X2,++posy);
//		printf("请输入第%d个学生信息:\t",i+1);
//		scanf("%ld%s",&stu[i].num, stu[i].name);
//		for (int j = 0; j < *m; ++j) {
//			scanf("%f",&stu[i].score[j]);
//		}

		//创建一个人，在堆中分配内存,循环n次
		Node* pNewNode = (Node*)malloc(sizeof(Node));
		//指针下一个指向空
		pNewNode->pNext = NULL;
		//查找链表的尾结点
		Node* p = g_pHead;
		while (g_pHead != NULL && p->pNext != NULL){
			p = p->pNext;
		}
		//把节点插到链表的尾节点
		if (g_pHead == NULL) {
			g_pHead = pNewNode;
		}
		else {
			p->pNext = pNewNode;
		}
		SetPosition(POS_X2,++posy);
		printf("请输入第%d个学生信息:\t",i+1);
		scanf("%ld%s",&pNewNode->stu.num, &pNewNode->stu.name);
		for (int j = 0; j < *m; ++j) {
			scanf("%f",&pNewNode->stu.score[j]);
		}
		if(bool == 0){
			t_pHead = pNewNode;
			bool++;
		}
	}
	
}
//计算学生成绩,链表已完成
void CalculateScoreOfStudent(int n, int m, Student stu[]){
	int i,j;
	printf("每个学生各门课程的总分和平均分：\n");
//	for(i=0;i<n;i++){
//		stu[i].sum=0;
//		for(j=0;j<m;j++){
//			stu[i].sum+=stu[i].score[j];
//		}
//		stu[i].aver=stu[i].sum/m;
//		printf("第%d个学生：总分=%.2f，平均分=%.2f\n",i+1,stu[i].sum,stu[i].aver);
//	}
	Node* p = g_pHead;
	for(i=0;i<n;i++){
		p->stu.sum = 0;
		for(j=0;j<m;j++){
			p->stu.sum += p->stu.score[j];
		}
		p->stu.aver = p->stu.sum/m;
		printf("第%d个学生：总分=%.2f，平均分=%.2f\n",i+1,p->stu.sum,p->stu.aver);
		p = p->pNext;
	}
}
//计算课程成绩
void CalculateScoreOfCourse(int n, int m, Student stu[]){
	int i,j;
	float sum[COUSE_NUM],aver[COUSE_NUM];
	int posy=7;
	SetPosition(POS_X1,posy);
	printf("各门课程的总分和平均分的计算结果为：");
	for(j=0;j<m;j++){
		sum[j]=0;
		for(i=0;i<n;i++){
			sum[j]+=stu[i].score[j];
		}
		aver[j]=sum[j]/n;
		SetPosition(POS_X1,++posy);
		printf("第%d门课程：总分=%.2f，平均分=%.2f\n",j+1,sum[j],aver[j]);
	}
}
//学生记录存盘,链表已完成
void WritetoFile(int n,int m,Student stu[]){
	Node* p = t_pHead;
	int i,j;
	FILE*fp;
	if((fp=fopen("C:\\Myproject\\StudentScoreManagementSystem\\data\\student.txt","w"))==NULL){
		printf("文件student.txt无法正常打开！");
		exit(0);
	}
	fprintf(fp,"%10d%10d\n",n,m);
//	for(i=0;i<n;i++){
//		fprintf(fp,"%10ld%10s\n",stu[i].num,stu[i].name);
//		for(j=0;j<m;j++){
//			fprintf(fp,"%10.1f\n",stu[i].score[j]);
//		}
//		fprintf(fp,"%10.1f%10.1f\n",stu[i].sum,stu[i].aver);
//	}
	for(i=0;i<n;i++){
		fprintf(fp,"%10ld%10s\n",p->stu.num,p->stu.name);
		for(j=0;j<m;j++){
			fprintf(fp,"%10.1f\n",p->stu.score[j]);
		}
		fprintf(fp,"%10.1f%10.1f\n",p->stu.sum,p->stu.aver);
		p = p->pNext;
	}
	fclose(fp);
	printf("存盘完毕！\n");
}
//读取学生记录
int ReadfromFile(int*n,int*m,Student stu[],int*first){
	FILE*fp;
	int i,j;
	int posy=8;
	SetPosition(POS_X1,posy);
	if((fp=fopen("C:\\Myproject\\StudentScoreManagementSystem\\data\\student.txt","r"))==NULL){
		printf("磁盘文件student.txt无法打开");
		return 1;
	}
	fscanf(fp,"%10d%10d",n,m);
	for(i=0;i<*n;i++){
		fscanf(fp,"%10ld",&stu[i].num);
		fscanf(fp,"%10s",stu[i].name);
		for(j=0;j<*m;j++){
			fscanf(fp,"%10f",&stu[i].score[j]);
		}
		fscanf(fp,"%10f%10f",&stu[i].sum,&stu[i].aver);
	}
	*first=0;
	fclose(fp);
	printf("数据从磁盘读取完毕！");
	return 0;
}
//增加学生记录
//void AppendRecord(int *n,int m,Student stu[]){
//	int i,j;
//	int num_record;
//	printf("请输入需要添加的学生记录条数：");
//	scanf("%d",&num_record);
//	while (*n+num_record>STU_NUM){
//		printf("需要增加的学生记录太多，请重新输入：");
//		scanf("%d",&num_record);
//	}
//	for (int i = *n; i < *n+num_record; ++i) {
//		printf("请输入第%d个学生信息：\t",i+1);
//		scanf("%ld%s",&stu[i].num,stu[i].name);
//		for (int j = 0; j < m; ++j) {
//			scanf("%f",&stu[i].score[j]);
//		}
//	}
//	*n = *n+num_record;
//	printf("添加完毕！\n");
//}
void AppendRecord(int *n,int m,Student stu[]){
	int i,j;
	int posy=6;
	int Bool=0;
	int num_record;
	printf("请输入需要添加的学生记录条数：");
	scanf("%d",&num_record);
	while (*n+num_record>STU_NUM){
		printf("需要增加的学生记录太多，请重新输入：");
		scanf("%d",&num_record);
	}
	//	for (int i = *n; i < *n+num_record; ++i) {
	//		printf("请输入第%d个学生信息：\t",i+1);
	//		scanf("%ld%s",&stu[i].num,stu[i].name);
	//		for (int j = 0; j < m; ++j) {
	//			scanf("%f",&stu[i].score[j])}}
	for (int i = 0; i < num_record; ++i) {
		//创建一个人，在堆中分配内存,循环n次
		Node* pNewNode = (Node*)malloc(sizeof(Node));
		//指针下一个指向空
		pNewNode->pNext = NULL;
		//查找链表的尾结点
		Node* p = g_pHead;
		while (g_pHead != NULL && p->pNext != NULL){
			p = p->pNext;
		}
		//把节点插到链表的尾节点
		if (g_pHead == NULL) {
			g_pHead = pNewNode;
		}
		else {
			p->pNext = pNewNode;
		}
		SetPosition(POS_X2,++posy);
		printf("请输入第%d个学生信息:\t",i+1);
		scanf("%ld%s",&pNewNode->stu.num, &pNewNode->stu.name);
		for (int j = 0; j <m; ++j) {
			scanf("%f",&pNewNode->stu.score[j]);
		}
		if(Bool == 0){
			t_pHead = pNewNode;
			Bool++;
		}
	}
	*n = *n+num_record;
	printf("添加完毕！\n");
}
//按学号查找学生记录
//void SearchbyNumber(int n, int m, Student *stu){
//	long id;
//	int i,j;
//	printf("请输入你要查找的学生的学号：");
//	scanf("%ld",&id);
//	for (int i = 0; i < n; ++i) {
//		if(stu[i].num == id){
//			printf("找到了，学号对应的学生信息为：\n");
//			printf("%10ld%15s",stu[i].num,stu[i].name);
//			for (int j = 0; j < m; ++j) {
//				printf("%10.2f",stu[i].score[j]);
//			}
//			printf("%10.2f%10.2f",stu[i].sum,stu[i].aver);
//			return;
//		}
//	}
//	printf("未找到这个学号对应的学生记录\n");
//}
void SearchbyNumber(int n, int m, Student *stu){
	//	long id;
	//	int i,j;
	//	printf("请输入你要查找的学生的学号：");
	//	scanf("%ld",&id);
	//	for (int i = 0; i < n; ++i) {
	//		if(stu[i].num == id){
	//			printf("找到了，学号对应的学生信息为：\n");
	//			printf("%10ld%15s",stu[i].num,stu[i].name);
	//			for (int j = 0; j < m; ++j) {
	//				printf("%10.2f",stu[i].score[j]);
	//			}
	//			printf("%10.2f%10.2f",stu[i].sum,stu[i].aver);
	//			return;
	//		}
	//	}
	//	printf("未找到这个学号对应的学生记录\n");
	long num;
	int flag = 0;
	Node* p = g_pHead;
	printf("请输入你要查找的学号");
	scanf_s("%ld", num);
	while (p != NULL){
		if (p->stu.num == num){
			printf("找到了,该学生的信息为：\n");
			printf("%10ld%15s", p->stu.num, p->stu.name);
			for (int j = 0;j < 10;j++){
				printf("%10.2f", p->stu.score[j]);
			}
			printf("%10.2f%10.2f\n", p->stu.num, p->stu.aver);
			flag = 0;
		}
		p = p->pNext;
	}
	if (flag){
		printf("未找到这个学号对应的学生记录\n");
	}
}
//按姓名查找学生记录
//void SearchbyName(int n, int m,Student* stu){
//	int flag = 1;
//	int i, j;
//	int k = 0;
//	char name[NAME_LEN];
//	
//	printf("请输入你要查找的姓名");
//	scanf_s("%s", name);
//	
//	for (i = 0;i < n;i++)
//	{
//		if (strcmp(stu[i].name, name) == 0)
//		{
//			printf("找到了,第%d个学生的信息为：\n", ++k);
//			printf("%10ld%15s", stu[i].num, stu[i].name);
//			for (j = 0;j < m;j++)
//			{
//				printf("%10.2f", stu[i].score[j]);
//			}
//			printf("%10.2f%10.2f\n", stu[i].num, stu[i].aver);
//			flag = 0;
//		}
//	}
//	if (flag)
//	{
//		printf("未找到这个姓名对应的学生记录\n");
//	}
//	return;
//}
void SearchbyName(int n, int m,Student stu[]){
	char name[NAME_LEN];
	int flag = 0;
	Node* p = g_pHead;
	printf("请输入你要查找的姓名");
	scanf_s("%s", name);
	while (p != NULL){
		if (strcmp(p->stu.name, name) == 0){
			printf("找到了,该学生的信息为：\n");
			printf("%10ld%15s", p->stu.num, p->stu.name);
			for (int j = 0;j < 10;j++){
				printf("%10.2f", p->stu.score[j]);
			}
			printf("%10.2f%10.2f\n", p->stu.num, p->stu.aver);
			flag = 0;
		}
		p = p->pNext;
	}
	if (flag){
		printf("未找到这个姓名对应的学生记录\n");
	}
}
//删除学生记录
//void DeleteRecord(int* n,int m,Student stu[]){
//	int i, j;
//	long id;
//	char ch='A';
//	printf("请输入你要删除学生信息对应的学号");
//	scanf_s("%ld", &id);
//	for (i = 0;i < *n;i++)
//	{
//		if (stu[i].num == id)
//		{
//			printf("找到了该生记录，信息为：\n");
//			printf("%10ld%15s", stu[i].num, stu[i].name);
//			for (j = 0;j < m;j++)
//			{
//				printf("%10.2f", stu[i].score[j]);
//			}
//			printf("%10.2f%10.2f\n", stu[i].num, stu[i].aver);
//			printf("请确认是否要删除这条记录？（Y or N）：");
//			getchar();
//			scanf_s("%c,&ch");
//			if (ch == 'Y')
//			{
//				for (j = i;i < *n - 1;j++)
//				{
//					stu[j] = stu[i + j];
//				}
//				(*n)--;
//				printf("删除完毕");
//				return;
//			}
//			else if (ch == 'N')
//			{
//				printf("找到了该生记录，但不删除\n");
//				return;
//			}
//			else
//			{
//				printf("输入错误\n");
//				return;
//			}
//		}
//	}
//	printf("未找到该生记录");
//	return;
//}
void DeleteRecord(int *n, int m,Student stu[]) {
	long id;
	char ch = 'A';
	printf("请输入你要删除学生信息对应的学号");
	scanf_s("%ld", &id);
	Node* p=g_pHead;
	Node* beforep = g_pHead;
	while (p != NULL)
	{
		if (p->stu.num == id)
		{
			printf("找到了该生记录，信息为：\n");
			printf("%10ld%15s", p->stu.num, p->stu.name);
			for (int j = 0;j < 10;j++)
			{
				printf("%10.2f", p->stu.score[j]);
			}
			printf("%10.2f%10.2f\n", p->stu.num, p->stu.aver);
			printf("请确认是否要删除这条记录？（Y or N）：");
			getchar();
			scanf_s("%c,&ch");
			if (ch == 'Y')
			{
				if (p == g_pHead)
				{
					g_pHead = p->pNext;
				}
				else if (p->pNext == NULL)
				{
					p = beforep;
					p->pNext = NULL;
				}
				else
				{
					beforep->pNext = p->pNext;
				}
				printf("删除完毕");
			}
			else if (ch == 'N')
			{
				printf("找到了该生记录，但不删除\n");
			}
			else
			{
				printf("输入错误\n");
			}
			beforep = p;
			p = p->pNext;
		}
		printf("未找到该生记录");
	}
}
//修改学生信息
//void ModifyRecord(int n,int m,Student stu[]){
//	int i,j;
//	long id;
//	char ch;
//	
//	printf("请输入需要修改信息对应的学号："); 
//	scanf("%ld",&id);
//	
//	for(i=0;i<n;i++)
//	{
//		if(stu[i].num==id)
//		{
//			printf("找到了该生记录，信息为：\n");
//			printf("%10ld%15s",stu[i].num,stu[i].name);
//			for(j=0;j<m;j++)
//			{
//				printf("%10.2f",stu[i].score[j]);
//			}
//			printf("%10.2f%10.2f\n",stu[i].sum,stu[i].aver);
//			
//			printf("请确认是否需要修改？(Y/N或y/n)");
//			getchar();
//			scanf("%c",&ch);
//			
//			if(ch=='Y'||ch=='y')
//			{
//				printf("请输入要修改的学生信息：");
//				scanf("%ld%s",&stu[i].num,stu[i].name);
//				stu[i].sum=0;
//				for(j=0;j<m;j++)
//				{
//					scanf("%f",&stu[i].score[j]);
//					stu[i].aver=stu[i].sum/m;
//				} 
//				stu[i].aver=stu[i].sum/m;
//				printf("修改完毕\n");
//				return;
//			} 
//			
//			else if(ch=='N'||ch=='n')
//			{
//				printf("找到了该生记录,但不修改\n");
//				return;
//			}
//			
//			else
//			{
//				printf("输入出错!\n");
//				return;
//			}
//		}
//	}
//	printf("未找到该生记录！\n");
//	return;
//} 
void ModifyRecord(int n,int m,Student stu[]){
	//	int i,j;
	//	long id;
	//	char ch;
	//	
	//	printf("请输入需要修改信息对应的学号："); 
	//	scanf("%ld",&id);
	//	
	//	for(i=0;i<n;i++)
	//	{
	//		if(stu[i].num==id)
	//		{
	//			printf("找到了该生记录，信息为：\n");
	//			printf("%10ld%15s",stu[i].num,stu[i].name);
	//			for(j=0;j<m;j++)
	//			{
	//				printf("%10.2f",stu[i].score[j]);
	//			}
	//			printf("%10.2f%10.2f\n",stu[i].sum,stu[i].aver);
	//			
	//			printf("请确认是否需要修改？(Y/N或y/n)");
	//			getchar();
	//			scanf("%c",&ch);
	//			
	//			if(ch=='Y'||ch=='y')
	//			{
	//				printf("请输入要修改的学生信息：");
	//				scanf("%ld%s",&stu[i].num,stu[i].name);
	//				stu[i].sum=0;
	//				for(j=0;j<m;j++)
	//				{
	//					scanf("%f",&stu[i].score[j]);
	//					stu[i].aver=stu[i].sum/m;
	//				} 
	//				stu[i].aver=stu[i].sum/m;
	//				printf("修改完毕\n");
	//				return;
	//			} 
	//			
	//			else if(ch=='N'||ch=='n')
	//			{
	//				printf("找到了该生记录,但不修改\n");
	//				return;
	//			}
	//			
	//			else
	//			{
	//				printf("输入出错!\n");
	//				return;
	//			}
	//		}
	//	}
	//	printf("未找到该生记录！\n");
	//	return;
	long id;
	char ch = 'A';
	printf("请输入你要修改学生信息对应的学号");
	scanf_s("%ld", &id);
	Node* p=g_pHead;
	Node* beforep = g_pHead;
	while (p != NULL)
	{
		if (p->stu.num == id)
		{
			printf("找到了该生记录，信息为：\n");
			printf("%10ld%15s", p->stu.num, p->stu.name);
			for (int j = 0;j < 10;j++)
			{
				printf("%10.2f", p->stu.score[j]);
			}
			printf("%10.2f%10.2f\n", p->stu.num, p->stu.aver);
			printf("请确认是否要修改这条记录？（Y or N）：");
			getchar();
			scanf_s("%c,&ch");
			if (ch == 'Y')
			{
				printf("请输入要修改的学生信息：");
				scanf("%ld%s",&p->stu.num, &p->stu.name);
				for (int j = 0; j <m; ++j) {
					scanf("%f",&p->stu.score[j]);
				}
			}
			else if (ch == 'N')
			{
				printf("找到了该生记录，但不修改\n");
			}
			else
			{
				printf("输入错误\n");
			}
			beforep = p;
			p = p->pNext;
		}
		printf("未找到该生记录");
	}
}
//打印学生信息,链表已完成
void PrintRecord(int n,int m,Student*stu){
	int i,j;
	printf("学号\t\t姓名\t\t");
	for(j=0;j<m;j++){
		printf("课程%d\t\t",j+1);
	}
	printf("总分\t\t平均分\n");
//	for(i=0;i<n;i++){
//		printf("%-16ld%-16s",stu[i].sum,stu[i].name);
//		for(j=0;j<m;j++){
//			printf("%-16.1lf",stu[i].score[j]);
//		}
//		printf("%-16.1lf%-16.1lf\n",stu[i].sum,stu[i].aver);
//	}
	Node* p = g_pHead;
	for(i=0;i<n;i++){
		printf("%-16ld%-16s",p->stu.num,p->stu.name);
		for(j=0;j<m;j++){
			printf("%-16.1lf",p->stu.score[j]);
		}
		printf("%-16.1lf%-16.1lf\n",p->stu.sum,p->stu.aver);
		p = p->pNext;
	}
}
//按姓名排序
//void SortbyName(int n,int m,Student stu[]){
//	int i,j;
//	Student temp;
//	for(i=0;i<n;i++){
//		for(j=0;j<n-1-i;j++){
//			if(strcmp(stu[j].name,stu[j+1].name)>0){
//				temp=stu[j];
//				stu[j]=stu[j+1];
//				stu[j+1]=temp;
//		}
//	}
//}
//printf("按姓名字典对学生记录排序完毕");
//return; 
//} 
//按姓名排序,链表已完成 
void SortbyName(int n,int m,Student stu[]){
	int i,j;
	Student temp;
	//	for(i=0;i<n;i++){
	//		for(j=0;j<n-1-i;j++){
	//			if(strcmp(stu[j].name,stu[j+1].name)>0){
	//				temp=stu[j];
	//				stu[j]=stu[j+1];
	//				stu[j+1]=temp;
	Node* p = g_pHead;
	for(i=0;i<n;i++){
		for(j=0;j<n-1;j++){
			if(strcmp(p->stu.name,p->pNext->stu.name)>0){
				temp=p->stu;
				p->stu=p->pNext->stu;
				p->pNext->stu=temp;
			}
			p = p->pNext ;
		}
		p = g_pHead;
	}
	printf("按姓名字典对学生记录排序完毕");
	return; 
} 
//按学号排序
//void SortbyNumber(int n,int m,Student*stu){
//	int i,j;
//	int k;
//	Student temp;
//	for(i=0;i<n;i++){
//		k=i;
//		for(j=i+1;j<n;j++){
//			if(stu[j].num<stu[k].num)
//			k=j;
//		}
//		if(k!=i){
//			temp=stu[k];
//			stu[k]=stu[i];
//			stu[i]=temp;
//		}
//	}
//	printf("按学号从小到大对学生记录排序完毕");
//}
//按学号排序,链表已完成 
void SortbyNumber(int n,int m,Student*stu){
	int i,j;
	int k;
	Student temp;
	//	for(i=0;i<n;i++){
	//		k=i;
	//		for(j=i+1;j<n;j++){
	//			if(stu[j].num<stu[k].num)
	//			k=j;
	//		}
	//		if(k!=i){
	//			temp=stu[k];
	//			stu[k]=stu[i];
	//			stu[i]=temp;
	//		}
	//	}
	Node* p = g_pHead;
	for(i=0;i<n;i++){
		for(j=0;j<n-1;j++){
			if(p->stu.num>p->pNext->stu.num){
				temp=p->stu;
				p->stu=p->pNext->stu;
				p->pNext->stu=temp;
			}
			p = p->pNext ;
		}
		p = g_pHead;
	}
	printf("按学号从小到大对学生记录排序完毕");
}
//按总分降序
int Descending(float a,float b){
	return a>b;
}
int Ascending(float a,float b){
	return a<b;
} 
void SortbyScore(int n,int m,Student*stu,int(*compare)(float a, float b)){
	int i,j;
	int k;
	Student temp;
	
	for(i=0;i<n;i++){
		k=i;
		for(j=i+1;j<n;j++){
			if((*compare)(stu[j].sum,stu[k].sum))
				k=j;
		}
		if(k!=i){
			temp=stu[k];
			stu[k]=stu[i];
			stu[i]=temp;
		}
	}
	printf("按学生成绩总分对学生记录排序完毕");
}
//学生成绩统计
void StatisticAnalysis(int n,int m,Student*stu){
	int i,j,t[6];
	for(j=0;j<m;j++){
		printf("\n课程%d成绩统计结果为:\n",j+1);
		printf("分数段\t人数\t占比\n");
		
		memset(t,0,sizeof(t));
		for(i=0;i<n;i++){
			if(stu[i].score[j]>=0&&stu[i].score[j]<60)
				t[0]++;
			else if(stu[i].score[j]<70)
				t[1]++;
			else if(stu[i].score[j]<80)
				t[2]++;
			else if(stu[i].score[j]<90)
				t[3]++;
			else if(stu[i].score[j]<100)
				t[4]++;
			else if(stu[i].score[j]==100)
				t[5]++;
		}
		
		for(i=0;i<6;i++){
			if(i==0)
				printf("<60\t%d\t%.2f%\n",t[i],(float)t[i]/n*100);
			else if(i==5)
				printf("100\t%d\t%.2f%\n",t[i],(float)t[i]/n*100);
			else
				printf("%d--%d\t%d\t%.2f%%\n",(i+5)*10,(i+5)*10+9,t[i],(float)t[i]/n*100);
		}
	}
	printf("\n学生成绩平均分统计结果为：\n");
	printf("分数段\t人数\t占比\t\n");
	memset(t,0,sizeof(t));
	for(i=0;i<0;i++){
		if(stu[i].aver>=0&&stu[i].aver<60)
			t[0]++;
		else if(stu[i].aver<70)
			t[1]++;
		else if(stu[i].aver<80)
			t[2]++;
		else if(stu[i].aver<90)
			t[3]++;
		else if(stu[i].aver<100)
			t[4]++;
		else if(stu[i].aver==100)
			t[5]++;
	}
	for(i=0;i<6;i++){
		if(i==0)
			printf("<60\t%d\t%.2f%\n",t[i],(float)t[i]/n*100);
		else if(i==5)
			printf("100\t%d\t%.2f%\n",t[i],(float)t[i]/n*100);
		else
			printf("%d--%d\t%d\t%.2f%%\n",(i+5)*10,(i+5)*10+9,t[i],(float)t[i]/n*100);
	}
	
}

